12
תגובות
אני בונה דף עם אפשרות העלאת קבצים לפי המדריך הזה (זה חלק אחד מתוך 4):
http://www.sitepoint.com/html5-ajax-file-upload/

אין בעיה להעלות קבצים עם שם באנגלית, אבל בקבצים בעברית לא נוצרת אפילו בקשת post
השליחה של הקבצים לשרת נעשית ע"י XMLHttpRequest();
ניסיתי לחפש ברשת פתרונות כמו להוסיף קידוד ל header אבל לא הצלחתי בשום נסיון

12 תשובות

avatar ענה OrelBeY ב 28 לינואר 2014 #

קודדת את השם לכתובת URL תקנית? (ב-JS יש לך את encodeURI().)

avatar ענה itamar ב 29 לינואר 2014 #

תודה רבה זאת באמת הייתה הבעיה, ועכשיו בעיה חדשה שאני מקבל את שם הקובץ או ככה (ע"י שימוש ב encodeURI):
%D7%99%D7%95%D7%98%D7%99%D7%95%D7%91.jpg

או ככה (ע"י שימוש ב urldecode ב php):
׳™׳•׳˜׳™׳•׳‘.jpg

avatar ענה OrelBeY ב 29 לינואר 2014 #

יש בעיה בקידוד. תנסה להוסיף את השורה הזאת בהתחלה:

header('Content-Type: text/html; charset=utf-8');

avatar ענה itamar ב 29 לינואר 2014 #

ניסיתי, זה לא עוזר

avatar ענה OrelBeY ב 29 לינואר 2014 #

שלחת את זה לסקריפט ה-PHP מטופס HTML? אם כן, תסדר את הקידוד שם (meta charset).

avatar ענה itamar ב 30 לינואר 2014 #

ה Html, js,php הם באותו קובץ ויש את התג <meta charset="utf-8">

כך נראה הבקשה בדפדפן:


וגם ניסיתי עכשיו לעשות replace לכל אות ואות ב php למשל

$filename = str_replace("%D7%90", "א", $filename);

ועדיין זה מחזיר לי סימנים מוזרים, אין לי מושג יש פה כנראה איזו טעות בקידוד של הדף

avatar ענה OrelBeY ב 30 לינואר 2014 #

משהו כאן לא בסדר. תוכל להדביק לכאן את קוד ה-PHP?

avatar ענה itamar ב 30 לינואר 2014 #

<?php
  function decodeToHebrew($filename)
  {
    $filename = str_replace("%D7%90", "א", $filename);
    $filename = str_replace("%D7%91", "ב", $filename);
    $filename = str_replace("%D7%92", "ג", $filename);
    $filename = str_replace("%D7%93", "ד", $filename);
    $filename = str_replace("%D7%94", "ה", $filename);
    $filename = str_replace("%D7%95", "ו", $filename);
    $filename = str_replace("%D7%96", "ז", $filename);
    $filename = str_replace("%D7%97", "ח", $filename);
    $filename = str_replace("%D7%98", "ט", $filename);
    $filename = str_replace("%D7%99", "י", $filename);
    $filename = str_replace("%D7%9B", "כ", $filename);
    $filename = str_replace("%D7%9A", "ך", $filename);
    $filename = str_replace("%D7%9C", "ל", $filename);
    $filename = str_replace("%D7%9E", "מ", $filename);
    $filename = str_replace("%D7%9D", "ם", $filename);
    $filename = str_replace("%D7%A0", "נ", $filename);
    $filename = str_replace("%D7%9F", "ן", $filename);
    $filename = str_replace("%D7%A1", "ס", $filename);
    $filename = str_replace("%D7%A2", "ע", $filename);
    $filename = str_replace("%D7%A4", "פ", $filename);
    $filename = str_replace("%D7%A3", "ף", $filename);
    $filename = str_replace("%D7%A6", "צ", $filename);
    $filename = str_replace("%D7%A5", "ץ", $filename);
    $filename = str_replace("%D7%A7", "ק", $filename);
    $filename = str_replace("%D7%A8", "ר", $filename);
    $filename = str_replace("%D7%A9", "ש", $filename);
    $filename = str_replace("%D7%AA", "ת", $filename);

    return $filename;
  }

  $fn = (isset($_SERVER['HTTP_X_FILENAME']) ? $_SERVER['HTTP_X_FILENAME'] : false);

  if ($fn)
  {
    // AJAX call
    file_put_contents('./uploads/' . decodeToHebrew($fn), file_get_contents('php://input'));
    echo "$fn uploaded";
    exit();
  }
  if (isset($_FILES['fileselect']))
  {
    // form submit
    $files = $_FILES['fileselect'];

    foreach ($files['error'] as $id => $err)
    {
      if ($err == UPLOAD_ERR_OK)
      {
        $fn = $files['name'][$id];
        move_uploaded_file($files['tmp_name'][$id],'uploads/' . $fn);
        echo "<p>File $fn uploaded.</p>";
      }
    }
  }
?>

avatar ענה OrelBeY ב 30 לינואר 2014 #

קודם כל, תוותר על הפונקציה decodeToHebrew ותשתמש בפונקציה rawurldecode המובנית. הבעיה היא לא שם, כמו שאתה יכול לראות.
אני לא רואה כאן את ה-Header של הקידוד. הוספת אותו לפני זה?

קצת מביך, אבל עבר לא מעט זמן מאז שהתעסקתי בפיתוח אינטרנט. מחיפוש שלי בגוגל על העלאת קבצים באמצעות AJAX לא ראיתי טיפול שונה ב-PHP עם HTTP_X_FILENAME וכל זה. מה הקטע של זה?

avatar ענה itamar ב 31 לינואר 2014 #

החלפתי ל rawurlencode אבל זה עדיין מביא לי את הסימנים המוזרים. הקידוד נמצא באמת בראש הדף של ה php
את האמת אין לי מושג למה דווקא ב HTTP_X_FILENAME , זה פשוט מה שהיה במדריך

avatar ענה OrelBeY ב 31 לינואר 2014 #

אם הקידוד של קובץ ה-PHP ושל קובץ ה-HTML שממנו בוצעה קריאת ה-AJAX זה UTF-8, אני לא יודע מה הבעיה. יכול להיות שאחרים יוכלו לענות על זה.
ייתכן שבעיית הקידוד מצומצמת איכשהו לנתון ה-HTTP_X_FILENAME או לקבוצת נתונים מסוימת שהוא כלול בה. חפש בגוגל מדריכים אחרים להעלאת קבצים; אני די בטוח ש-HTTP_X_FILENAME הוא לא חלק מהתהליך הסטנדרטי להעלאת קבצים, ומשום מה אני לא מצליח למצוא שום דבר רשמי על זה. ><

עריכה:
לפי מה שאני מבין (ואני לא כל כך בטוח בזה) הקידוד כנראה יהיה זהה לקידוד של הקובץ שאתה מעלה. כך שאתה יכול להמיר את זה ל-UTF8:

iconv(mb_detect_encoding($fn, mb_detect_order(), true), "UTF-8", $fn)

או
mb_convert_encoding($fn, 'UTF-8', 'UTF-8, ISO-8859-1')

אבל חייב להיות פתרון טוב יותר (לא שאני בטוח שזה שאמרתי בכלל עובד). אני מקווה שמישהו שמבין בזה יותר יפתור לך את הבעיה.

avatar ענה OrelBeY ב 01 לפברואר 2014 #

קשה לי לדבג את זה ככה. תוכל להעלות את הקובץ לאנשהו ואני אעבור עליו ואדבג אותו?
תוכל לשלוח לי לאימייל: [email protected]
משום מה נורא מבלבל אותי כל הנושא הזה.